home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / specialhost / source / dither.c < prev    next >
C/C++ Source or Header  |  1995-03-15  |  63KB  |  2,636 lines

  1. /*
  2. **    SpecialHost for PasTeX
  3. **
  4. **    Copyright © by Olaf Barthel & Georg Heßmann
  5. */
  6.  
  7. #include "Global.h"
  8.  
  9. STATIC LONG Seed = 42013;
  10.  
  11. extern __far struct Custom custom;    /* (hes) */
  12.  
  13.  
  14. LONG __regargs
  15. ScaleImage(struct BitMap **BitMapPtr,struct GreyImage *Image,LONG NewWidth,LONG NewHeight)
  16. {
  17.     struct BitMap    *BitMap    = NULL;
  18.     LONG         Error    = 0;
  19.     UBYTE        *TempLine;
  20.  
  21.     if(TempLine = CreateTempLine(NewWidth,1))
  22.     {
  23.         if(BitMap = CreateBitMap(NewWidth,NewHeight,1,BMF_CLEAR,NULL))
  24.         {
  25.             struct RastPort __aligned DummyRPort,*TempRPort;
  26.  
  27.             InitRastPort(&DummyRPort);
  28.  
  29.             DummyRPort . BitMap = BitMap;
  30.  
  31.             if(TempRPort = CreateTempRPort(&DummyRPort))
  32.             {
  33.                 LONG     i,j;
  34.                 UBYTE    *Line;
  35.  
  36.                 if(NewHeight == Image -> Height)
  37.                 {
  38.                     if(NewWidth == Image -> Width)
  39.                     {
  40.                         for(i = 0 ; i < NewHeight ; i++)
  41.                         {
  42.                             Line = Image -> Lines[i];
  43.  
  44.                             for(j = 0 ; j < NewWidth ; j++)
  45.                                 TempLine[j] = ((BYTE)Filter[*Line++] >= 0);
  46.  
  47.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  48.  
  49.                             ShowProgress(i);
  50.                         }
  51.                     }
  52.                     else
  53.                     {
  54.                         for(i = 0 ; i < NewHeight ; i++)
  55.                         {
  56.                             Line = Image -> Lines[i];
  57.  
  58.                             for(j = 0 ; j < NewWidth ; j++)
  59.                                 TempLine[j] = ((BYTE)Filter[Line[(j * Image -> Width) / NewWidth]] >= 0);
  60.  
  61.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  62.  
  63.                             ShowProgress(i);
  64.                         }
  65.                     }
  66.                 }
  67.                 else
  68.                 {
  69.                     LONG        Y,LastY = -1;
  70.                     PLANEPTR    Offset = BitMap -> Planes[0];
  71.  
  72.                     if(NewWidth == Image -> Width)
  73.                     {
  74.                         for(i = 0 ; i < NewHeight ; i++)
  75.                         {
  76.                             if((Y = (i * Image -> Height) / NewHeight) == LastY)
  77.                                 CopyMem(Offset - BitMap -> BytesPerRow,Offset,BitMap -> BytesPerRow);
  78.                             else
  79.                             {
  80.                                 Line = Image -> Lines[LastY = Y];
  81.  
  82.                                 for(j = 0 ; j < NewWidth ; j++)
  83.                                     TempLine[j] = ((BYTE)Filter[Line[j]] >= 0);
  84.  
  85.                                 (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  86.                             }
  87.  
  88.                             Offset += BitMap -> BytesPerRow;
  89.  
  90.                             ShowProgress(i);
  91.                         }
  92.                     }
  93.                     else
  94.                     {
  95.                         for(i = 0 ; i < NewHeight ; i++)
  96.                         {
  97.                             if((Y = (i * Image -> Height) / NewHeight) == LastY)
  98.                                 CopyMem(Offset - BitMap -> BytesPerRow,Offset,BitMap -> BytesPerRow);
  99.                             else
  100.                             {
  101.                                 Line = Image -> Lines[LastY = Y];
  102.  
  103.                                 for(j = 0 ; j < NewWidth ; j++)
  104.                                     TempLine[j] = ((BYTE)Filter[Line[(j * Image -> Width) / NewWidth]] >= 0);
  105.  
  106.                                 (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  107.                             }
  108.  
  109.                             Offset += BitMap -> BytesPerRow;
  110.  
  111.                             ShowProgress(i);
  112.                         }
  113.                     }
  114.                 }
  115.  
  116.                 DeleteTempRPort(TempRPort);
  117.             }
  118.             else
  119.             {
  120.                 DeleteBitMap(BitMap);
  121.  
  122.                 BitMap = NULL;
  123.  
  124.                 Error = ERR_NO_MEM;
  125.             }
  126.         }
  127.         else
  128.             Error = ERR_NO_MEM;
  129.  
  130.         DeleteTempLine(TempLine);
  131.     }
  132.     else
  133.         Error = ERR_NO_MEM;
  134.  
  135.     *BitMapPtr = BitMap;
  136.  
  137.     return(Error);
  138. }
  139.  
  140. LONG __regargs
  141. DitherImage_Matrix(struct BitMap **BitMapPtr,struct GreyImage *Image,LONG NewWidth,LONG NewHeight,UBYTE *Matrix)
  142. {
  143.     struct BitMap    *BitMap    = NULL;
  144.     LONG         Error    = 0;
  145.     UBYTE        *TempLine;
  146.  
  147.     if(TempLine = CreateTempLine(NewWidth,1))
  148.     {
  149.         if(BitMap = CreateBitMap(NewWidth,NewHeight,1,BMF_CLEAR,NULL))
  150.         {
  151.             struct RastPort __aligned DummyRPort,*TempRPort;
  152.  
  153.             InitRastPort(&DummyRPort);
  154.  
  155.             DummyRPort . BitMap = BitMap;
  156.  
  157.             if(TempRPort = CreateTempRPort(&DummyRPort))
  158.             {
  159.                 if(Matrix)
  160.                 {
  161.                     LONG     i,j;
  162.                     UBYTE    *Line,
  163.                         *Row = Matrix;
  164.  
  165.                     if(NewHeight == Image -> Height)
  166.                     {
  167.                         for(i = 0 ; i < NewHeight ; i++)
  168.                         {
  169.                             if(i & 15)
  170.                                 Row += 16;
  171.                             else
  172.                                 Row = Matrix;
  173.  
  174.                             Line = Image -> Lines[i];
  175.  
  176.                             for(j = 0 ; j < NewWidth ; j++)
  177.                                 TempLine[j] = (Filter[Line[(j * Image -> Width) / NewWidth]] <= Row[j & 15]);
  178.  
  179.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  180.  
  181.                             ShowProgress(i);
  182.                         }
  183.                     }
  184.                     else
  185.                     {
  186.                         for(i = 0 ; i < NewHeight ; i++)
  187.                         {
  188.                             if(i & 15)
  189.                                 Row += 16;
  190.                             else
  191.                                 Row = Matrix;
  192.  
  193.                             Line = (BYTE *)Image -> Lines[(i * Image -> Height) / NewHeight];
  194.  
  195.                             for(j = 0 ; j < NewWidth ; j++)
  196.                                 TempLine[j] = (Filter[Line[(j * Image -> Width) / NewWidth]] <= Row[j & 15]);
  197.  
  198.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  199.  
  200.                             ShowProgress(i);
  201.                         }
  202.                     }
  203.                 }
  204.                 else
  205.                 {
  206.                     UWORD     Value;
  207.                     LONG     i,j;
  208.                     UBYTE    *Line;
  209.  
  210.                     Value = Seed + custom . vhposr + 16411;
  211.  
  212.                     if(NewHeight == Image -> Height)
  213.                     {
  214.                         for(i = 0 ; i < NewHeight ; i++)
  215.                         {
  216.                             Line = Image -> Lines[i];
  217.  
  218.                             for(j = 0 ; j < NewWidth ; j++)
  219.                             {
  220.                                 TempLine[j] = (Filter[Line[(j * Image -> Width) / NewWidth]] <= (Value & 0xFF));
  221.  
  222.                                 Value += custom . vhposr + 16411;
  223.                             }
  224.  
  225.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  226.  
  227.                             ShowProgress(i);
  228.                         }
  229.                     }
  230.                     else
  231.                     {
  232.                         for(i = 0 ; i < NewHeight ; i++)
  233.                         {
  234.                             Line = (BYTE *)Image -> Lines[(i * Image -> Height) / NewHeight];
  235.  
  236.                             for(j = 0 ; j < NewWidth ; j++)
  237.                             {
  238.                                 TempLine[j] = (Filter[Line[(j * Image -> Width) / NewWidth]] <= (Value & 0xFF));
  239.  
  240.                                 Value += custom . vhposr + 16411;
  241.                             }
  242.  
  243.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  244.  
  245.                             ShowProgress(i);
  246.                         }
  247.                     }
  248.  
  249.                     Seed = Value;
  250.                 }
  251.  
  252.                 DeleteTempRPort(TempRPort);
  253.             }
  254.             else
  255.             {
  256.                 DeleteBitMap(BitMap);
  257.  
  258.                 BitMap = NULL;
  259.  
  260.                 Error = ERR_NO_MEM;
  261.             }
  262.         }
  263.         else
  264.             Error = ERR_NO_MEM;
  265.  
  266.         DeleteTempLine(TempLine);
  267.     }
  268.     else
  269.         Error = ERR_NO_MEM;
  270.  
  271.     *BitMapPtr = BitMap;
  272.  
  273.     return(Error);
  274. }
  275.  
  276. LONG __regargs
  277. DitherImage_FS(struct BitMap **BitMapPtr,struct GreyImage *Image,LONG NewWidth,LONG NewHeight)
  278. {
  279.     struct BitMap    *BitMap    = NULL;
  280.     LONG         Error    = 0;
  281.     APTR         Data;
  282.  
  283.     if(Data = AllocVecPooled(2 * (NewWidth + 2) * sizeof(WORD),MEMF_ANY | MEMF_CLEAR))
  284.     {
  285.         UBYTE *TempLine;
  286.  
  287.         if(TempLine = CreateTempLine(NewWidth,1))
  288.         {
  289.             if(BitMap = CreateBitMap(NewWidth,NewHeight,1,BMF_CLEAR,NULL))
  290.             {
  291.                 struct RastPort __aligned DummyRPort,*TempRPort;
  292.  
  293.                 InitRastPort(&DummyRPort);
  294.  
  295.                 DummyRPort . BitMap = BitMap;
  296.  
  297.                 if(TempRPort = CreateTempRPort(&DummyRPort))
  298.                 {
  299.                     LONG     i,j;
  300.                     UBYTE    *Line;
  301.  
  302.                     WORD    *ThisError,
  303.                         *NextError,
  304.                          Value,
  305.                          Valu2;
  306.  
  307.                     ThisError = Data;
  308.                     NextError = ThisError + NewWidth + 2;
  309.  
  310.                     ThisError++;
  311.                     NextError++;
  312.  
  313.                     j = Seed + custom . vhposr + 16411;
  314.  
  315.                     for(i = 0 ; i < NewWidth ; i++)
  316.                     {
  317.                         ThisError[i] = ((j & 1023) - 512) / 4;
  318.  
  319.                         j += custom . vhposr + 16411;
  320.                     }
  321.  
  322.                     Seed = j;
  323.  
  324.                     if(NewHeight == Image -> Height)
  325.                     {
  326.                         for(i = 0 ; i < NewHeight ; i++)
  327.                         {
  328.                             Line = Image -> Lines[i];
  329.  
  330.                             if(i & 1)
  331.                             {
  332.                                 for(j = 0 ; j < NewWidth ; j++)
  333.                                 {
  334.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 16) > 255)
  335.                                         Value = 255;
  336.                                     else
  337.                                     {
  338.                                         if(Value < 0)
  339.                                             Value = 0;
  340.                                     }
  341.  
  342.                                     if(TempLine[j] = (Value < 128))
  343.                                     {
  344.                                         if(Valu2 = Value + Value)
  345.                                         {
  346.                                             NextError[j + 1]     = Value;Value += Valu2;
  347.                                             NextError[j - 1]    += Value;Value += Valu2;
  348.                                             NextError[j]        += Value;Value += Valu2;
  349.                                             ThisError[j + 1]    += Value;
  350.                                         }
  351.                                     }
  352.                                     else
  353.                                     {
  354.                                         if(Value = Value - 255)
  355.                                         {
  356.                                             Valu2 = Value + Value;
  357.  
  358.                                             NextError[j + 1]     = Value;Value += Valu2;
  359.                                             NextError[j - 1]    += Value;Value += Valu2;
  360.                                             NextError[j]        += Value;Value += Valu2;
  361.                                             ThisError[j + 1]    += Value;
  362.                                         }
  363.                                     }
  364.                                 }
  365.  
  366.                                 {
  367.                                     register WORD *Swap;
  368.  
  369.                                     Swap        = ThisError;
  370.                                     ThisError    = NextError;
  371.                                     NextError    = Swap;
  372.  
  373.                                     Swap[NewWidth - 1] = 0;
  374.  
  375.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  376.                                 }
  377.                             }
  378.                             else
  379.                             {
  380.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  381.                                 {
  382.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 16) > 255)
  383.                                         Value = 255;
  384.                                     else
  385.                                     {
  386.                                         if(Value < 0)
  387.                                             Value = 0;
  388.                                     }
  389.  
  390.                                     if(TempLine[j] = (Value < 128))
  391.                                     {
  392.                                         if(Valu2 = Value + Value)
  393.                                         {
  394.                                             NextError[j - 1]     = Value;Value += Valu2;
  395.                                             NextError[j + 1]    += Value;Value += Valu2;
  396.                                             NextError[j]        += Value;Value += Valu2;
  397.                                             ThisError[j - 1]    += Value;
  398.                                         }
  399.                                     }
  400.                                     else
  401.                                     {
  402.                                         if(Value = Value - 255)
  403.                                         {
  404.                                             Valu2 = Value + Value;
  405.  
  406.                                             NextError[j - 1]     = Value;Value += Valu2;
  407.                                             NextError[j + 1]    += Value;Value += Valu2;
  408.                                             NextError[j]        += Value;Value += Valu2;
  409.                                             ThisError[j - 1]    += Value;
  410.                                         }
  411.                                     }
  412.                                 }
  413.  
  414.                                 {
  415.                                     register WORD *Swap;
  416.  
  417.                                     Swap        = ThisError;
  418.                                     ThisError    = NextError;
  419.                                     NextError    = Swap;
  420.  
  421.                                     *Swap = 0;
  422.  
  423.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  424.                                 }
  425.                             }
  426.  
  427.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  428.  
  429.                             ShowProgress(i);
  430.                         }
  431.                     }
  432.                     else
  433.                     {
  434.                         for(i = 0 ; i < NewHeight ; i++)
  435.                         {
  436.                             Line = (UBYTE *)Image -> Lines[(i * Image -> Height) / NewHeight];
  437.  
  438.                             if(i & 1)
  439.                             {
  440.                                 for(j = 0 ; j < NewWidth ; j++)
  441.                                 {
  442.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 16) > 255)
  443.                                         Value = 255;
  444.                                     else
  445.                                     {
  446.                                         if(Value < 0)
  447.                                             Value = 0;
  448.                                     }
  449.  
  450.                                     if(TempLine[j] = (Value < 128))
  451.                                     {
  452.                                         if(Valu2 = Value + Value)
  453.                                         {
  454.                                             NextError[j + 1]     = Value;Value += Valu2;
  455.                                             NextError[j - 1]    += Value;Value += Valu2;
  456.                                             NextError[j]        += Value;Value += Valu2;
  457.                                             ThisError[j + 1]    += Value;
  458.                                         }
  459.                                     }
  460.                                     else
  461.                                     {
  462.                                         if(Value = Value - 255)
  463.                                         {
  464.                                             Valu2 = Value + Value;
  465.  
  466.                                             NextError[j + 1]     = Value;Value += Valu2;
  467.                                             NextError[j - 1]    += Value;Value += Valu2;
  468.                                             NextError[j]        += Value;Value += Valu2;
  469.                                             ThisError[j + 1]    += Value;
  470.                                         }
  471.                                     }
  472.                                 }
  473.  
  474.                                 {
  475.                                     register WORD *Swap;
  476.  
  477.                                     Swap        = ThisError;
  478.                                     ThisError    = NextError;
  479.                                     NextError    = Swap;
  480.  
  481.                                     Swap[NewWidth - 1] = 0;
  482.  
  483.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  484.                                 }
  485.                             }
  486.                             else
  487.                             {
  488.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  489.                                 {
  490.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 16) > 255)
  491.                                         Value = 255;
  492.                                     else
  493.                                     {
  494.                                         if(Value < 0)
  495.                                             Value = 0;
  496.                                     }
  497.  
  498.                                     if(TempLine[j] = (Value < 128))
  499.                                     {
  500.                                         if(Valu2 = Value + Value)
  501.                                         {
  502.                                             NextError[j - 1]     = Value;Value += Valu2;
  503.                                             NextError[j + 1]    += Value;Value += Valu2;
  504.                                             NextError[j]        += Value;Value += Valu2;
  505.                                             ThisError[j - 1]    += Value;
  506.                                         }
  507.                                     }
  508.                                     else
  509.                                     {
  510.                                         if(Value = Value - 255)
  511.                                         {
  512.                                             Valu2 = Value + Value;
  513.  
  514.                                             NextError[j - 1]     = Value;Value += Valu2;
  515.                                             NextError[j + 1]    += Value;Value += Valu2;
  516.                                             NextError[j]        += Value;Value += Valu2;
  517.                                             ThisError[j - 1]    += Value;
  518.                                         }
  519.                                     }
  520.                                 }
  521.  
  522.                                 {
  523.                                     register WORD *Swap;
  524.  
  525.                                     Swap        = ThisError;
  526.                                     ThisError    = NextError;
  527.                                     NextError    = Swap;
  528.  
  529.                                     *Swap = 0;
  530.  
  531.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  532.                                 }
  533.                             }
  534.  
  535.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  536.  
  537.                             ShowProgress(i);
  538.                         }
  539.                     }
  540.  
  541.                     DeleteTempRPort(TempRPort);
  542.                 }
  543.                 else
  544.                 {
  545.                     DeleteBitMap(BitMap);
  546.  
  547.                     BitMap = NULL;
  548.  
  549.                     Error = ERR_NO_MEM;
  550.                 }
  551.             }
  552.             else
  553.                 Error = ERR_NO_MEM;
  554.  
  555.             DeleteTempLine(TempLine);
  556.         }
  557.         else
  558.             Error = ERR_NO_MEM;
  559.  
  560.         FreeVecPooled(Data);
  561.     }
  562.     else
  563.         Error = ERR_NO_MEM;
  564.  
  565.     *BitMapPtr = BitMap;
  566.  
  567.     return(Error);
  568. }
  569.  
  570. LONG __regargs
  571. DitherImage_Burkes(struct BitMap **BitMapPtr,struct GreyImage *Image,LONG NewWidth,LONG NewHeight)
  572. {
  573.     struct BitMap    *BitMap    = NULL;
  574.     LONG         Error    = 0;
  575.     APTR         Data;
  576.  
  577.     if(Data = AllocVecPooled(2 * (NewWidth + 4) * sizeof(WORD),MEMF_ANY | MEMF_CLEAR))
  578.     {
  579.         UBYTE *TempLine;
  580.  
  581.         if(TempLine = CreateTempLine(NewWidth,1))
  582.         {
  583.             if(BitMap = CreateBitMap(NewWidth,NewHeight,1,BMF_CLEAR,NULL))
  584.             {
  585.                 struct RastPort __aligned DummyRPort,*TempRPort;
  586.  
  587.                 InitRastPort(&DummyRPort);
  588.  
  589.                 DummyRPort . BitMap = BitMap;
  590.  
  591.                 if(TempRPort = CreateTempRPort(&DummyRPort))
  592.                 {
  593.                     LONG     i,j;
  594.                     UBYTE    *Line;
  595.  
  596.                     WORD    *ThisError,
  597.                         *NextError,
  598.                          Value;
  599.  
  600.                     ThisError = Data;
  601.                     NextError = ThisError + NewWidth + 4;
  602.  
  603.                     ThisError += 2;
  604.                     NextError += 2;
  605.  
  606.                     if(NewHeight == Image -> Height)
  607.                     {
  608.                         for(i = 0 ; i < NewHeight ; i++)
  609.                         {
  610.                             Line = Image -> Lines[i];
  611.  
  612.                             if(i & 1)
  613.                             {
  614.                                 for(j = 0 ; j < NewWidth ; j++)
  615.                                 {
  616.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 32) > 255)
  617.                                         Value = 255;
  618.                                     else
  619.                                     {
  620.                                         if(Value < 0)
  621.                                             Value = 0;
  622.                                     }
  623.  
  624.                                     if(TempLine[j] = (Value < 128))
  625.                                     {
  626.                                         if(Value)
  627.                                         {
  628.                                             Value += Value;
  629.  
  630.                                             NextError[j + 2]     = Value;
  631.                                             NextError[j - 2]    += Value;Value += Value;
  632.                                             NextError[j + 1]    += Value;
  633.                                             NextError[j - 1]    += Value;
  634.                                             ThisError[j + 2]    += Value;Value += Value;
  635.                                             NextError[j]        += Value;
  636.                                             ThisError[j + 1]    += Value;
  637.                                         }
  638.                                     }
  639.                                     else
  640.                                     {
  641.                                         if(Value = Value - 255)
  642.                                         {
  643.                                             Value += Value;
  644.  
  645.                                             NextError[j + 2]     = Value;
  646.                                             NextError[j - 2]    += Value;Value += Value;
  647.                                             NextError[j + 1]    += Value;
  648.                                             NextError[j - 1]    += Value;
  649.                                             ThisError[j + 2]    += Value;Value += Value;
  650.                                             NextError[j]        += Value;
  651.                                             ThisError[j + 1]    += Value;
  652.                                         }
  653.                                     }
  654.                                 }
  655.  
  656.                                 {
  657.                                     register WORD *Swap;
  658.  
  659.                                     Swap        = ThisError;
  660.                                     ThisError    = NextError;
  661.                                     NextError    = Swap;
  662.  
  663.                                     Swap[NewWidth - 1] = 0;
  664.                                     Swap[NewWidth - 2] = 0;
  665.  
  666.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  667.                                 }
  668.                             }
  669.                             else
  670.                             {
  671.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  672.                                 {
  673.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 32) > 255)
  674.                                         Value = 255;
  675.                                     else
  676.                                     {
  677.                                         if(Value < 0)
  678.                                             Value = 0;
  679.                                     }
  680.  
  681.                                     if(TempLine[j] = (Value < 128))
  682.                                     {
  683.                                         if(Value)
  684.                                         {
  685.                                             Value += Value;
  686.  
  687.                                             NextError[j - 2]     = Value;
  688.                                             NextError[j + 2]    += Value;Value += Value;
  689.                                             NextError[j - 1]    += Value;
  690.                                             NextError[j + 1]    += Value;
  691.                                             ThisError[j - 2]    += Value;Value += Value;
  692.                                             NextError[j]        += Value;
  693.                                             ThisError[j - 1]    += Value;
  694.                                         }
  695.                                     }
  696.                                     else
  697.                                     {
  698.                                         if(Value = Value - 255)
  699.                                         {
  700.                                             Value += Value;
  701.  
  702.                                             NextError[j - 2]     = Value;
  703.                                             NextError[j + 2]    += Value;Value += Value;
  704.                                             NextError[j - 1]    += Value;
  705.                                             NextError[j + 1]    += Value;
  706.                                             ThisError[j - 2]    += Value;Value += Value;
  707.                                             NextError[j]        += Value;
  708.                                             ThisError[j - 1]    += Value;
  709.                                         }
  710.                                     }
  711.                                 }
  712.  
  713.                                 {
  714.                                     register WORD *Swap;
  715.  
  716.                                     Swap        = ThisError;
  717.                                     ThisError    = NextError;
  718.                                     NextError    = Swap;
  719.  
  720.                                     Swap[0] = 0;
  721.                                     Swap[1] = 0;
  722.  
  723.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  724.                                 }
  725.                             }
  726.  
  727.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  728.  
  729.                             ShowProgress(i);
  730.                         }
  731.                     }
  732.                     else
  733.                     {
  734.                         for(i = 0 ; i < NewHeight ; i++)
  735.                         {
  736.                             Line = (UBYTE *)Image -> Lines[(i * Image -> Height) / NewHeight];
  737.  
  738.                             if(i & 1)
  739.                             {
  740.                                 for(j = 0 ; j < NewWidth ; j++)
  741.                                 {
  742.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 32) > 255)
  743.                                         Value = 255;
  744.                                     else
  745.                                     {
  746.                                         if(Value < 0)
  747.                                             Value = 0;
  748.                                     }
  749.  
  750.                                     if(TempLine[j] = (Value < 128))
  751.                                     {
  752.                                         if(Value)
  753.                                         {
  754.                                             Value += Value;
  755.  
  756.                                             NextError[j + 2]     = Value;
  757.                                             NextError[j - 2]    += Value;Value += Value;
  758.                                             NextError[j + 1]    += Value;
  759.                                             NextError[j - 1]    += Value;
  760.                                             ThisError[j + 2]    += Value;Value += Value;
  761.                                             NextError[j]        += Value;
  762.                                             ThisError[j + 1]    += Value;
  763.                                         }
  764.                                     }
  765.                                     else
  766.                                     {
  767.                                         if(Value = Value - 255)
  768.                                         {
  769.                                             Value += Value;
  770.  
  771.                                             NextError[j + 2]     = Value;
  772.                                             NextError[j - 2]    += Value;Value += Value;
  773.                                             NextError[j + 1]    += Value;
  774.                                             NextError[j - 1]    += Value;
  775.                                             ThisError[j + 2]    += Value;Value += Value;
  776.                                             NextError[j]        += Value;
  777.                                             ThisError[j + 1]    += Value;
  778.                                         }
  779.                                     }
  780.                                 }
  781.  
  782.                                 {
  783.                                     register WORD *Swap;
  784.  
  785.                                     Swap        = ThisError;
  786.                                     ThisError    = NextError;
  787.                                     NextError    = Swap;
  788.  
  789.                                     Swap[NewWidth - 1] = 0;
  790.                                     Swap[NewWidth - 2] = 0;
  791.  
  792.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  793.                                 }
  794.                             }
  795.                             else
  796.                             {
  797.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  798.                                 {
  799.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 32) > 255)
  800.                                         Value = 255;
  801.                                     else
  802.                                     {
  803.                                         if(Value < 0)
  804.                                             Value = 0;
  805.                                     }
  806.  
  807.                                     if(TempLine[j] = (Value < 128))
  808.                                     {
  809.                                         if(Value)
  810.                                         {
  811.                                             Value += Value;
  812.  
  813.                                             NextError[j - 2]     = Value;
  814.                                             NextError[j + 2]    += Value;Value += Value;
  815.                                             NextError[j - 1]    += Value;
  816.                                             NextError[j + 1]    += Value;
  817.                                             ThisError[j - 2]    += Value;Value += Value;
  818.                                             NextError[j]        += Value;
  819.                                             ThisError[j - 1]    += Value;
  820.                                         }
  821.                                     }
  822.                                     else
  823.                                     {
  824.                                         if(Value = Value - 255)
  825.                                         {
  826.                                             Value += Value;
  827.  
  828.                                             NextError[j - 2]     = Value;
  829.                                             NextError[j + 2]    += Value;Value += Value;
  830.                                             NextError[j - 1]    += Value;
  831.                                             NextError[j + 1]    += Value;
  832.                                             ThisError[j - 2]    += Value;Value += Value;
  833.                                             NextError[j]        += Value;
  834.                                             ThisError[j - 1]    += Value;
  835.                                         }
  836.                                     }
  837.                                 }
  838.  
  839.                                 {
  840.                                     register WORD *Swap;
  841.  
  842.                                     Swap        = ThisError;
  843.                                     ThisError    = NextError;
  844.                                     NextError    = Swap;
  845.  
  846.                                     Swap[0] = 0;
  847.                                     Swap[1] = 0;
  848.  
  849.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  850.                                 }
  851.                             }
  852.  
  853.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  854.  
  855.                             ShowProgress(i);
  856.                         }
  857.                     }
  858.  
  859.                     DeleteTempRPort(TempRPort);
  860.                 }
  861.                 else
  862.                 {
  863.                     DeleteBitMap(BitMap);
  864.  
  865.                     BitMap = NULL;
  866.  
  867.                     Error = ERR_NO_MEM;
  868.                 }
  869.             }
  870.             else
  871.                 Error = ERR_NO_MEM;
  872.  
  873.             DeleteTempLine(TempLine);
  874.         }
  875.         else
  876.             Error = ERR_NO_MEM;
  877.  
  878.         FreeVecPooled(Data);
  879.     }
  880.     else
  881.         Error = ERR_NO_MEM;
  882.  
  883.     *BitMapPtr = BitMap;
  884.  
  885.     return(Error);
  886. }
  887.  
  888. LONG __regargs
  889. DitherImage_Sierra(struct BitMap **BitMapPtr,struct GreyImage *Image,LONG NewWidth,LONG NewHeight)
  890. {
  891.     struct BitMap    *BitMap    = NULL;
  892.     LONG         Error    = 0;
  893.     APTR         Data;
  894.  
  895.     if(Data = AllocVecPooled(3 * (NewWidth + 4) * sizeof(WORD),MEMF_ANY | MEMF_CLEAR))
  896.     {
  897.         UBYTE *TempLine;
  898.  
  899.         if(TempLine = CreateTempLine(NewWidth,1))
  900.         {
  901.             if(BitMap = CreateBitMap(NewWidth,NewHeight,1,BMF_CLEAR,NULL))
  902.             {
  903.                 struct RastPort __aligned DummyRPort,*TempRPort;
  904.  
  905.                 InitRastPort(&DummyRPort);
  906.  
  907.                 DummyRPort . BitMap = BitMap;
  908.  
  909.                 if(TempRPort = CreateTempRPort(&DummyRPort))
  910.                 {
  911.                     LONG     i,j;
  912.                     UBYTE    *Line;
  913.  
  914.                     WORD    *ThisError,
  915.                         *NextError,
  916.                         *LastError,
  917.                          Fill,
  918.                          Value;
  919.  
  920.                     ThisError = Data;
  921.                     NextError = ThisError + NewWidth + 4;
  922.                     LastError = NextError + NewWidth + 4;
  923.  
  924.                     ThisError += 2;
  925.                     NextError += 2;
  926.                     LastError += 2;
  927.  
  928.                     if(NewHeight == Image -> Height)
  929.                     {
  930.                         for(i = 0 ; i < NewHeight ; i++)
  931.                         {
  932.                             Line = Image -> Lines[i];
  933.  
  934.                             if(i & 1)
  935.                             {
  936.                                 for(j = 0 ; j < NewWidth ; j++)
  937.                                 {
  938.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 32) > 255)
  939.                                         Value = 255;
  940.                                     else
  941.                                     {
  942.                                         if(Value < 0)
  943.                                             Value = 0;
  944.                                     }
  945.  
  946.                                     if(TempLine[j] = (Value < 128))
  947.                                     {
  948.                                         if(Value)
  949.                                         {
  950.                                             Fill = Value + Value;
  951.  
  952.                                             LastError[j + 1]     = Fill;
  953.                                             LastError[j - 1]    += Fill;
  954.                                             NextError[j + 2]    += Fill;
  955.                                             NextError[j - 2]    += Fill; Fill += Value;
  956.                                             ThisError[j + 2]    += Fill;
  957.                                             LastError[j]        += Fill; Fill += Value;
  958.                                             NextError[j + 1]    += Fill;
  959.                                             NextError[j - 1]    += Fill; Fill += Value;
  960.                                             NextError[j]        += Fill;
  961.                                             ThisError[j + 1]    += Fill;
  962.                                         }
  963.                                     }
  964.                                     else
  965.                                     {
  966.                                         if(Value = Value - 255)
  967.                                         {
  968.                                             Fill = Value + Value;
  969.  
  970.                                             LastError[j + 1]     = Fill;
  971.                                             LastError[j - 1]    += Fill;
  972.                                             NextError[j + 2]    += Fill;
  973.                                             NextError[j - 2]    += Fill; Fill += Value;
  974.                                             ThisError[j + 2]    += Fill;
  975.                                             LastError[j]        += Fill; Fill += Value;
  976.                                             NextError[j + 1]    += Fill;
  977.                                             NextError[j - 1]    += Fill; Fill += Value;
  978.                                             NextError[j]        += Fill;
  979.                                             ThisError[j + 1]    += Fill;
  980.                                         }
  981.                                     }
  982.                                 }
  983.  
  984.                                 {
  985.                                     register WORD *Swap;
  986.  
  987.                                     Swap        = ThisError;
  988.                                     ThisError    = NextError;
  989.                                     NextError    = LastError;
  990.                                     LastError    = Swap;
  991.  
  992.                                     Swap[NewWidth - 1] = 0;
  993.                                     Swap[NewWidth - 2] = 0;
  994.  
  995.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  996.                                 }
  997.                             }
  998.                             else
  999.                             {
  1000.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  1001.                                 {
  1002.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 32) > 255)
  1003.                                         Value = 255;
  1004.                                     else
  1005.                                     {
  1006.                                         if(Value < 0)
  1007.                                             Value = 0;
  1008.                                     }
  1009.  
  1010.                                     if(TempLine[j] = (Value < 128))
  1011.                                     {
  1012.                                         if(Value)
  1013.                                         {
  1014.                                             Fill = Value + Value;
  1015.  
  1016.                                             LastError[j - 1]     = Fill;
  1017.                                             LastError[j + 1]    += Fill;
  1018.                                             NextError[j - 2]    += Fill;
  1019.                                             NextError[j + 2]    += Fill; Fill += Value;
  1020.                                             ThisError[j - 2]    += Fill;
  1021.                                             LastError[j]        += Fill; Fill += Value;
  1022.                                             NextError[j - 1]    += Fill;
  1023.                                             NextError[j + 1]    += Fill; Fill += Value;
  1024.                                             NextError[j]        += Fill;
  1025.                                             ThisError[j - 1]    += Fill;
  1026.                                         }
  1027.                                     }
  1028.                                     else
  1029.                                     {
  1030.                                         if(Value = Value - 255)
  1031.                                         {
  1032.                                             Fill = Value + Value;
  1033.  
  1034.                                             LastError[j - 1]     = Fill;
  1035.                                             LastError[j + 1]    += Fill;
  1036.                                             NextError[j - 2]    += Fill;
  1037.                                             NextError[j + 2]    += Fill; Fill += Value;
  1038.                                             ThisError[j - 2]    += Fill;
  1039.                                             LastError[j]        += Fill; Fill += Value;
  1040.                                             NextError[j - 1]    += Fill;
  1041.                                             NextError[j + 1]    += Fill; Fill += Value;
  1042.                                             NextError[j]        += Fill;
  1043.                                             ThisError[j - 1]    += Fill;
  1044.                                         }
  1045.                                     }
  1046.                                 }
  1047.  
  1048.                                 {
  1049.                                     register WORD *Swap;
  1050.  
  1051.                                     Swap        = ThisError;
  1052.                                     ThisError    = NextError;
  1053.                                     NextError    = LastError;
  1054.                                     LastError    = Swap;
  1055.  
  1056.                                     Swap[0] = 0;
  1057.                                     Swap[1] = 0;
  1058.  
  1059.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  1060.                                 }
  1061.                             }
  1062.  
  1063.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  1064.  
  1065.                             ShowProgress(i);
  1066.                         }
  1067.                     }
  1068.                     else
  1069.                     {
  1070.                         for(i = 0 ; i < NewHeight ; i++)
  1071.                         {
  1072.                             Line = (UBYTE *)Image -> Lines[(i * Image -> Height) / NewHeight];
  1073.  
  1074.                             if(i & 1)
  1075.                             {
  1076.                                 for(j = 0 ; j < NewWidth ; j++)
  1077.                                 {
  1078.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 32) > 255)
  1079.                                         Value = 255;
  1080.                                     else
  1081.                                     {
  1082.                                         if(Value < 0)
  1083.                                             Value = 0;
  1084.                                     }
  1085.  
  1086.                                     if(TempLine[j] = (Value < 128))
  1087.                                     {
  1088.                                         if(Value)
  1089.                                         {
  1090.                                             Fill = Value + Value;
  1091.  
  1092.                                             LastError[j + 1]     = Fill;
  1093.                                             LastError[j - 1]    += Fill;
  1094.                                             NextError[j + 2]    += Fill;
  1095.                                             NextError[j - 2]    += Fill; Fill += Value;
  1096.                                             ThisError[j + 2]    += Fill;
  1097.                                             LastError[j]        += Fill; Fill += Value;
  1098.                                             NextError[j + 1]    += Fill;
  1099.                                             NextError[j - 1]    += Fill; Fill += Value;
  1100.                                             NextError[j]        += Fill;
  1101.                                             ThisError[j + 1]    += Fill;
  1102.                                         }
  1103.                                     }
  1104.                                     else
  1105.                                     {
  1106.                                         if(Value = Value - 255)
  1107.                                         {
  1108.                                             Fill = Value + Value;
  1109.  
  1110.                                             LastError[j + 1]     = Fill;
  1111.                                             LastError[j - 1]    += Fill;
  1112.                                             NextError[j + 2]    += Fill;
  1113.                                             NextError[j - 2]    += Fill; Fill += Value;
  1114.                                             ThisError[j + 2]    += Fill;
  1115.                                             LastError[j]        += Fill; Fill += Value;
  1116.                                             NextError[j + 1]    += Fill;
  1117.                                             NextError[j - 1]    += Fill; Fill += Value;
  1118.                                             NextError[j]        += Fill;
  1119.                                             ThisError[j + 1]    += Fill;
  1120.                                         }
  1121.                                     }
  1122.                                 }
  1123.  
  1124.                                 {
  1125.                                     register WORD *Swap;
  1126.  
  1127.                                     Swap        = ThisError;
  1128.                                     ThisError    = NextError;
  1129.                                     NextError    = LastError;
  1130.                                     LastError    = Swap;
  1131.  
  1132.                                     Swap[NewWidth - 1] = 0;
  1133.                                     Swap[NewWidth - 2] = 0;
  1134.  
  1135.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  1136.                                 }
  1137.                             }
  1138.                             else
  1139.                             {
  1140.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  1141.                                 {
  1142.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 32) > 255)
  1143.                                         Value = 255;
  1144.                                     else
  1145.                                     {
  1146.                                         if(Value < 0)
  1147.                                             Value = 0;
  1148.                                     }
  1149.  
  1150.                                     if(TempLine[j] = (Value < 128))
  1151.                                     {
  1152.                                         if(Value)
  1153.                                         {
  1154.                                             Fill = Value + Value;
  1155.  
  1156.                                             LastError[j - 1]     = Fill;
  1157.                                             LastError[j + 1]    += Fill;
  1158.                                             NextError[j - 2]    += Fill;
  1159.                                             NextError[j + 2]    += Fill; Fill += Value;
  1160.                                             ThisError[j - 2]    += Fill;
  1161.                                             LastError[j]        += Fill; Fill += Value;
  1162.                                             NextError[j - 1]    += Fill;
  1163.                                             NextError[j + 1]    += Fill; Fill += Value;
  1164.                                             NextError[j]        += Fill;
  1165.                                             ThisError[j - 1]    += Fill;
  1166.                                         }
  1167.                                     }
  1168.                                     else
  1169.                                     {
  1170.                                         if(Value = Value - 255)
  1171.                                         {
  1172.                                             Fill = Value + Value;
  1173.  
  1174.                                             LastError[j - 1]     = Fill;
  1175.                                             LastError[j + 1]    += Fill;
  1176.                                             NextError[j - 2]    += Fill;
  1177.                                             NextError[j + 2]    += Fill; Fill += Value;
  1178.                                             ThisError[j - 2]    += Fill;
  1179.                                             LastError[j]        += Fill; Fill += Value;
  1180.                                             NextError[j - 1]    += Fill;
  1181.                                             NextError[j + 1]    += Fill; Fill += Value;
  1182.                                             NextError[j]        += Fill;
  1183.                                             ThisError[j - 1]    += Fill;
  1184.                                         }
  1185.                                     }
  1186.                                 }
  1187.  
  1188.                                 {
  1189.                                     register WORD *Swap;
  1190.  
  1191.                                     Swap        = ThisError;
  1192.                                     ThisError    = NextError;
  1193.                                     NextError    = LastError;
  1194.                                     LastError    = Swap;
  1195.  
  1196.                                     Swap[0] = 0;
  1197.                                     Swap[1] = 0;
  1198.  
  1199.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  1200.                                 }
  1201.                             }
  1202.  
  1203.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  1204.  
  1205.                             ShowProgress(i);
  1206.                         }
  1207.                     }
  1208.  
  1209.                     DeleteTempRPort(TempRPort);
  1210.                 }
  1211.                 else
  1212.                 {
  1213.                     DeleteBitMap(BitMap);
  1214.  
  1215.                     BitMap = NULL;
  1216.  
  1217.                     Error = ERR_NO_MEM;
  1218.                 }
  1219.             }
  1220.             else
  1221.                 Error = ERR_NO_MEM;
  1222.  
  1223.             DeleteTempLine(TempLine);
  1224.         }
  1225.         else
  1226.             Error = ERR_NO_MEM;
  1227.  
  1228.         FreeVecPooled(Data);
  1229.     }
  1230.     else
  1231.         Error = ERR_NO_MEM;
  1232.  
  1233.     *BitMapPtr = BitMap;
  1234.  
  1235.     return(Error);
  1236. }
  1237.  
  1238. LONG __regargs
  1239. DitherImage_JJN(struct BitMap **BitMapPtr,struct GreyImage *Image,LONG NewWidth,LONG NewHeight)
  1240. {
  1241.     struct BitMap    *BitMap    = NULL;
  1242.     LONG         Error    = 0;
  1243.     APTR         Data;
  1244.  
  1245.     if(Data = AllocVecPooled(3 * (NewWidth + 4) * sizeof(WORD),MEMF_ANY | MEMF_CLEAR))
  1246.     {
  1247.         UBYTE *TempLine;
  1248.  
  1249.         if(TempLine = CreateTempLine(NewWidth,1))
  1250.         {
  1251.             if(BitMap = CreateBitMap(NewWidth,NewHeight,1,BMF_CLEAR,NULL))
  1252.             {
  1253.                 struct RastPort __aligned DummyRPort,*TempRPort;
  1254.  
  1255.                 InitRastPort(&DummyRPort);
  1256.  
  1257.                 DummyRPort . BitMap = BitMap;
  1258.  
  1259.                 if(TempRPort = CreateTempRPort(&DummyRPort))
  1260.                 {
  1261.                     LONG     i,j;
  1262.                     UBYTE    *Line;
  1263.  
  1264.                     WORD    *ThisError,
  1265.                         *NextError,
  1266.                         *LastError,
  1267.                          Fill,
  1268.                          Value;
  1269.  
  1270.                     ThisError = Data;
  1271.                     NextError = ThisError + NewWidth + 4;
  1272.                     LastError = NextError + NewWidth + 4;
  1273.  
  1274.                     ThisError += 2;
  1275.                     NextError += 2;
  1276.                     LastError += 2;
  1277.  
  1278.                     if(NewHeight == Image -> Height)
  1279.                     {
  1280.                         for(i = 0 ; i < NewHeight ; i++)
  1281.                         {
  1282.                             Line = Image -> Lines[i];
  1283.  
  1284.                             if(i & 1)
  1285.                             {
  1286.                                 for(j = 0 ; j < NewWidth ; j++)
  1287.                                 {
  1288.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 48) > 255)
  1289.                                         Value = 255;
  1290.                                     else
  1291.                                     {
  1292.                                         if(Value < 0)
  1293.                                             Value = 0;
  1294.                                     }
  1295.  
  1296.                                     if(TempLine[j] = (Value < 128))
  1297.                                     {
  1298.                                         if(Value)
  1299.                                         {
  1300.                                             Fill = Value + Value;
  1301.  
  1302.                                             LastError[j + 2]     = Value;
  1303.                                             LastError[j - 2]    += Value;Value += Fill;
  1304.                                             LastError[j + 1]    += Value;
  1305.                                             LastError[j - 1]    += Value;
  1306.                                             NextError[j + 2]    += Value;
  1307.                                             NextError[j - 2]    += Value;Value += Fill;
  1308.                                             LastError[j]        += Value;
  1309.                                             NextError[j + 1]    += Value;
  1310.                                             NextError[j - 1]    += Value;
  1311.                                             ThisError[j + 2]    += Value;Value += Fill;
  1312.                                             ThisError[j + 1]    += Value;
  1313.                                             NextError[j]        += Value;
  1314.                                         }
  1315.                                     }
  1316.                                     else
  1317.                                     {
  1318.                                         if(Value = Value - 255)
  1319.                                         {
  1320.                                             Fill = Value + Value;
  1321.  
  1322.                                             LastError[j + 2]     = Value;
  1323.                                             LastError[j - 2]    += Value;Value += Fill;
  1324.                                             LastError[j + 1]    += Value;
  1325.                                             LastError[j - 1]    += Value;
  1326.                                             NextError[j + 2]    += Value;
  1327.                                             NextError[j - 2]    += Value;Value += Fill;
  1328.                                             LastError[j]        += Value;
  1329.                                             NextError[j + 1]    += Value;
  1330.                                             NextError[j - 1]    += Value;
  1331.                                             ThisError[j + 2]    += Value;Value += Fill;
  1332.                                             ThisError[j + 1]    += Value;
  1333.                                             NextError[j]        += Value;
  1334.                                         }
  1335.                                     }
  1336.                                 }
  1337.  
  1338.                                 {
  1339.                                     register WORD *Swap;
  1340.  
  1341.                                     Swap        = ThisError;
  1342.                                     ThisError    = NextError;
  1343.                                     NextError    = LastError;
  1344.                                     LastError    = Swap;
  1345.  
  1346.                                     Swap[NewWidth - 1] = 0;
  1347.                                     Swap[NewWidth - 2] = 0;
  1348.  
  1349.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  1350.                                 }
  1351.                             }
  1352.                             else
  1353.                             {
  1354.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  1355.                                 {
  1356.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 48) > 255)
  1357.                                         Value = 255;
  1358.                                     else
  1359.                                     {
  1360.                                         if(Value < 0)
  1361.                                             Value = 0;
  1362.                                     }
  1363.  
  1364.                                     if(TempLine[j] = (Value < 128))
  1365.                                     {
  1366.                                         if(Value)
  1367.                                         {
  1368.                                             Fill = Value + Value;
  1369.  
  1370.                                             LastError[j - 2]     = Value;
  1371.                                             LastError[j + 2]    += Value;Value += Fill;
  1372.                                             LastError[j - 1]    += Value;
  1373.                                             LastError[j + 1]    += Value;
  1374.                                             NextError[j - 2]    += Value;
  1375.                                             NextError[j + 2]    += Value;Value += Fill;
  1376.                                             LastError[j]        += Value;
  1377.                                             NextError[j - 1]    += Value;
  1378.                                             NextError[j + 1]    += Value;
  1379.                                             ThisError[j - 2]    += Value;Value += Fill;
  1380.                                             ThisError[j - 1]    += Value;
  1381.                                             NextError[j]        += Value;
  1382.                                         }
  1383.                                     }
  1384.                                     else
  1385.                                     {
  1386.                                         if(Value = Value - 255)
  1387.                                         {
  1388.                                             Fill = Value + Value;
  1389.  
  1390.                                             LastError[j - 2]     = Value;
  1391.                                             LastError[j + 2]    += Value;Value += Fill;
  1392.                                             LastError[j - 1]    += Value;
  1393.                                             LastError[j + 1]    += Value;
  1394.                                             NextError[j - 2]    += Value;
  1395.                                             NextError[j + 2]    += Value;Value += Fill;
  1396.                                             LastError[j]        += Value;
  1397.                                             NextError[j - 1]    += Value;
  1398.                                             NextError[j + 1]    += Value;
  1399.                                             ThisError[j - 2]    += Value;Value += Fill;
  1400.                                             ThisError[j - 1]    += Value;
  1401.                                             NextError[j]        += Value;
  1402.                                         }
  1403.                                     }
  1404.                                 }
  1405.  
  1406.                                 {
  1407.                                     register WORD *Swap;
  1408.  
  1409.                                     Swap        = ThisError;
  1410.                                     ThisError    = NextError;
  1411.                                     NextError    = LastError;
  1412.                                     LastError    = Swap;
  1413.  
  1414.                                     Swap[0] = 0;
  1415.                                     Swap[1] = 0;
  1416.  
  1417.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  1418.                                 }
  1419.                             }
  1420.  
  1421.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  1422.  
  1423.                             ShowProgress(i);
  1424.                         }
  1425.                     }
  1426.                     else
  1427.                     {
  1428.                         for(i = 0 ; i < NewHeight ; i++)
  1429.                         {
  1430.                             Line = (UBYTE *)Image -> Lines[(i * Image -> Height) / NewHeight];
  1431.  
  1432.                             if(i & 1)
  1433.                             {
  1434.                                 for(j = 0 ; j < NewWidth ; j++)
  1435.                                 {
  1436.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 48) > 255)
  1437.                                         Value = 255;
  1438.                                     else
  1439.                                     {
  1440.                                         if(Value < 0)
  1441.                                             Value = 0;
  1442.                                     }
  1443.  
  1444.                                     if(TempLine[j] = (Value < 128))
  1445.                                     {
  1446.                                         if(Value)
  1447.                                         {
  1448.                                             Fill = Value + Value;
  1449.  
  1450.                                             LastError[j + 2]     = Value;
  1451.                                             LastError[j - 2]    += Value;Value += Fill;
  1452.                                             LastError[j + 1]    += Value;
  1453.                                             LastError[j - 1]    += Value;
  1454.                                             NextError[j + 2]    += Value;
  1455.                                             NextError[j - 2]    += Value;Value += Fill;
  1456.                                             LastError[j]        += Value;
  1457.                                             NextError[j + 1]    += Value;
  1458.                                             NextError[j - 1]    += Value;
  1459.                                             ThisError[j + 2]    += Value;Value += Fill;
  1460.                                             ThisError[j + 1]    += Value;
  1461.                                             NextError[j]        += Value;
  1462.                                         }
  1463.                                     }
  1464.                                     else
  1465.                                     {
  1466.                                         if(Value = Value - 255)
  1467.                                         {
  1468.                                             Fill = Value + Value;
  1469.  
  1470.                                             LastError[j + 2]     = Value;
  1471.                                             LastError[j - 2]    += Value;Value += Fill;
  1472.                                             LastError[j + 1]    += Value;
  1473.                                             LastError[j - 1]    += Value;
  1474.                                             NextError[j + 2]    += Value;
  1475.                                             NextError[j - 2]    += Value;Value += Fill;
  1476.                                             LastError[j]        += Value;
  1477.                                             NextError[j + 1]    += Value;
  1478.                                             NextError[j - 1]    += Value;
  1479.                                             ThisError[j + 2]    += Value;Value += Fill;
  1480.                                             ThisError[j + 1]    += Value;
  1481.                                             NextError[j]        += Value;
  1482.                                         }
  1483.                                     }
  1484.                                 }
  1485.  
  1486.                                 {
  1487.                                     register WORD *Swap;
  1488.  
  1489.                                     Swap        = ThisError;
  1490.                                     ThisError    = NextError;
  1491.                                     NextError    = LastError;
  1492.                                     LastError    = Swap;
  1493.  
  1494.                                     Swap[NewWidth - 1] = 0;
  1495.                                     Swap[NewWidth - 2] = 0;
  1496.  
  1497.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  1498.                                 }
  1499.                             }
  1500.                             else
  1501.                             {
  1502.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  1503.                                 {
  1504.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 48) > 255)
  1505.                                         Value = 255;
  1506.                                     else
  1507.                                     {
  1508.                                         if(Value < 0)
  1509.                                             Value = 0;
  1510.                                     }
  1511.  
  1512.                                     if(TempLine[j] = (Value < 128))
  1513.                                     {
  1514.                                         if(Value)
  1515.                                         {
  1516.                                             Fill = Value + Value;
  1517.  
  1518.                                             LastError[j - 2]     = Value;
  1519.                                             LastError[j + 2]    += Value;Value += Fill;
  1520.                                             LastError[j - 1]    += Value;
  1521.                                             LastError[j + 1]    += Value;
  1522.                                             NextError[j - 2]    += Value;
  1523.                                             NextError[j + 2]    += Value;Value += Fill;
  1524.                                             LastError[j]        += Value;
  1525.                                             NextError[j - 1]    += Value;
  1526.                                             NextError[j + 1]    += Value;
  1527.                                             ThisError[j - 2]    += Value;Value += Fill;
  1528.                                             ThisError[j - 1]    += Value;
  1529.                                             NextError[j]        += Value;
  1530.                                         }
  1531.                                     }
  1532.                                     else
  1533.                                     {
  1534.                                         if(Value = Value - 255)
  1535.                                         {
  1536.                                             Fill = Value + Value;
  1537.  
  1538.                                             LastError[j - 2]     = Value;
  1539.                                             LastError[j + 2]    += Value;Value += Fill;
  1540.                                             LastError[j - 1]    += Value;
  1541.                                             LastError[j + 1]    += Value;
  1542.                                             NextError[j - 2]    += Value;
  1543.                                             NextError[j + 2]    += Value;Value += Fill;
  1544.                                             LastError[j]        += Value;
  1545.                                             NextError[j - 1]    += Value;
  1546.                                             NextError[j + 1]    += Value;
  1547.                                             ThisError[j - 2]    += Value;Value += Fill;
  1548.                                             ThisError[j - 1]    += Value;
  1549.                                             NextError[j]        += Value;
  1550.                                         }
  1551.                                     }
  1552.                                 }
  1553.  
  1554.                                 {
  1555.                                     register WORD *Swap;
  1556.  
  1557.                                     Swap        = ThisError;
  1558.                                     ThisError    = NextError;
  1559.                                     NextError    = LastError;
  1560.                                     LastError    = Swap;
  1561.  
  1562.                                     Swap[0] = 0;
  1563.                                     Swap[1] = 0;
  1564.  
  1565.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  1566.                                 }
  1567.                             }
  1568.  
  1569.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  1570.  
  1571.                             ShowProgress(i);
  1572.                         }
  1573.                     }
  1574.  
  1575.                     DeleteTempRPort(TempRPort);
  1576.                 }
  1577.                 else
  1578.                 {
  1579.                     DeleteBitMap(BitMap);
  1580.  
  1581.                     BitMap = NULL;
  1582.  
  1583.                     Error = ERR_NO_MEM;
  1584.                 }
  1585.             }
  1586.             else
  1587.                 Error = ERR_NO_MEM;
  1588.  
  1589.             DeleteTempLine(TempLine);
  1590.         }
  1591.         else
  1592.             Error = ERR_NO_MEM;
  1593.  
  1594.         FreeVecPooled(Data);
  1595.     }
  1596.     else
  1597.         Error = ERR_NO_MEM;
  1598.  
  1599.     *BitMapPtr = BitMap;
  1600.  
  1601.     return(Error);
  1602. }
  1603.  
  1604. LONG __regargs
  1605. DitherImage_Stevenson_Arce(struct BitMap **BitMapPtr,struct GreyImage *Image,LONG NewWidth,LONG NewHeight)
  1606. {
  1607.     struct BitMap    *BitMap    = NULL;
  1608.     LONG         Error    = 0;
  1609.     APTR         Data;
  1610.  
  1611.     if(Data = AllocVecPooled(4 * (NewWidth + 6) * sizeof(LONG),MEMF_ANY | MEMF_CLEAR))
  1612.     {
  1613.         UBYTE *TempLine;
  1614.  
  1615.         if(TempLine = CreateTempLine(NewWidth,1))
  1616.         {
  1617.             if(BitMap = CreateBitMap(NewWidth,NewHeight,1,BMF_CLEAR,NULL))
  1618.             {
  1619.                 struct RastPort __aligned DummyRPort,*TempRPort;
  1620.  
  1621.                 InitRastPort(&DummyRPort);
  1622.  
  1623.                 DummyRPort . BitMap = BitMap;
  1624.  
  1625.                 if(TempRPort = CreateTempRPort(&DummyRPort))
  1626.                 {
  1627.                     LONG     i,j;
  1628.                     UBYTE    *Line;
  1629.  
  1630.                     LONG    *ThisError,
  1631.                         *NextError,
  1632.                         *TempError,
  1633.                         *LastError,
  1634.                          Value;
  1635.  
  1636.                     ThisError = Data;
  1637.                     NextError = ThisError + NewWidth + 6;
  1638.                     TempError = NextError + NewWidth + 6;
  1639.                     LastError = TempError + NewWidth + 6;
  1640.  
  1641.                     ThisError += 3;
  1642.                     NextError += 3;
  1643.                     TempError += 3;
  1644.                     LastError += 3;
  1645.  
  1646.                     if(NewHeight == Image -> Height)
  1647.                     {
  1648.                         for(i = 0 ; i < NewHeight ; i++)
  1649.                         {
  1650.                             Line = Image -> Lines[i];
  1651.  
  1652.                             if(i & 1)
  1653.                             {
  1654.                                 for(j = 0 ; j < NewWidth ; j++)
  1655.                                 {
  1656.                                     if((Value = (LONG)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 200) > 255)
  1657.                                         Value = 255;
  1658.                                     else
  1659.                                     {
  1660.                                         if(Value < 0)
  1661.                                             Value = 0;
  1662.                                     }
  1663.  
  1664.                                     if(TempLine[j] = (Value < 128))
  1665.                                     {
  1666.                                         if(Value)
  1667.                                         {
  1668.                                             ThisError[j + 2]    += 32 * Value;
  1669.  
  1670.                                             NextError[j - 3]    += 12 * Value;
  1671.                                             NextError[j - 1]    += 26 * Value;
  1672.                                             NextError[j + 1]    += 30 * Value;
  1673.                                             NextError[j + 3]    += 16 * Value;
  1674.  
  1675.                                             TempError[j - 2]    += 12 * Value;
  1676.                                             TempError[j    ]    += 26 * Value;
  1677.                                             TempError[j + 2]    += 12 * Value;
  1678.  
  1679.                                             LastError[j - 3]    +=  5 * Value;
  1680.                                             LastError[j - 1]    += 12 * Value;
  1681.                                             LastError[j + 1]    += 12 * Value;
  1682.                                             LastError[j + 3]    +=  5 * Value;
  1683.                                         }
  1684.                                     }
  1685.                                     else
  1686.                                     {
  1687.                                         if(Value = Value - 255)
  1688.                                         {
  1689.                                             ThisError[j + 2]    += 32 * Value;
  1690.  
  1691.                                             NextError[j - 3]    += 12 * Value;
  1692.                                             NextError[j - 1]    += 26 * Value;
  1693.                                             NextError[j + 1]    += 30 * Value;
  1694.                                             NextError[j + 3]    += 16 * Value;
  1695.  
  1696.                                             TempError[j - 2]    += 12 * Value;
  1697.                                             TempError[j    ]    += 26 * Value;
  1698.                                             TempError[j + 2]    += 12 * Value;
  1699.  
  1700.                                             LastError[j - 3]    +=  5 * Value;
  1701.                                             LastError[j - 1]    += 12 * Value;
  1702.                                             LastError[j + 1]    += 12 * Value;
  1703.                                             LastError[j + 3]    +=  5 * Value;
  1704.                                         }
  1705.                                     }
  1706.                                 }
  1707.  
  1708.                                 {
  1709.                                     register LONG *Swap;
  1710.  
  1711.                                     Swap        = ThisError;
  1712.                                     ThisError    = NextError;
  1713.                                     NextError    = TempError;
  1714.                                     TempError    = LastError;
  1715.                                     LastError    = Swap;
  1716.  
  1717.                                     memset(Swap,0,sizeof(LONG) * NewWidth);
  1718.                                 }
  1719.                             }
  1720.                             else
  1721.                             {
  1722.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  1723.                                 {
  1724.                                     if((Value = (LONG)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 200) > 255)
  1725.                                         Value = 255;
  1726.                                     else
  1727.                                     {
  1728.                                         if(Value < 0)
  1729.                                             Value = 0;
  1730.                                     }
  1731.  
  1732.                                     if(TempLine[j] = (Value < 128))
  1733.                                     {
  1734.                                         if(Value)
  1735.                                         {
  1736.                                             ThisError[j - 2]    += 32 * Value;
  1737.  
  1738.                                             NextError[j + 3]    += 12 * Value;
  1739.                                             NextError[j + 1]    += 26 * Value;
  1740.                                             NextError[j - 1]    += 30 * Value;
  1741.                                             NextError[j - 3]    += 16 * Value;
  1742.  
  1743.                                             TempError[j + 2]    += 12 * Value;
  1744.                                             TempError[j    ]    += 26 * Value;
  1745.                                             TempError[j - 2]    += 12 * Value;
  1746.  
  1747.                                             LastError[j + 3]    +=  5 * Value;
  1748.                                             LastError[j + 1]    += 12 * Value;
  1749.                                             LastError[j - 1]    += 12 * Value;
  1750.                                             LastError[j - 3]    +=  5 * Value;
  1751.                                         }
  1752.                                     }
  1753.                                     else
  1754.                                     {
  1755.                                         if(Value = Value - 255)
  1756.                                         {
  1757.                                             ThisError[j - 2]    += 32 * Value;
  1758.  
  1759.                                             NextError[j + 3]    += 12 * Value;
  1760.                                             NextError[j + 1]    += 26 * Value;
  1761.                                             NextError[j - 1]    += 30 * Value;
  1762.                                             NextError[j - 3]    += 16 * Value;
  1763.  
  1764.                                             TempError[j + 2]    += 12 * Value;
  1765.                                             TempError[j    ]    += 26 * Value;
  1766.                                             TempError[j - 2]    += 12 * Value;
  1767.  
  1768.                                             LastError[j + 3]    +=  5 * Value;
  1769.                                             LastError[j + 1]    += 12 * Value;
  1770.                                             LastError[j - 1]    += 12 * Value;
  1771.                                             LastError[j - 3]    +=  5 * Value;
  1772.                                         }
  1773.                                     }
  1774.                                 }
  1775.  
  1776.                                 {
  1777.                                     register LONG *Swap;
  1778.  
  1779.                                     Swap        = ThisError;
  1780.                                     ThisError    = NextError;
  1781.                                     NextError    = TempError;
  1782.                                     TempError    = LastError;
  1783.                                     LastError    = Swap;
  1784.  
  1785.                                     memset(Swap,0,sizeof(LONG) * NewWidth);
  1786.                                 }
  1787.                             }
  1788.  
  1789.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  1790.  
  1791.                             ShowProgress(i);
  1792.                         }
  1793.                     }
  1794.                     else
  1795.                     {
  1796.                         for(i = 0 ; i < NewHeight ; i++)
  1797.                         {
  1798.                             Line = (UBYTE *)Image -> Lines[(i * Image -> Height) / NewHeight];
  1799.  
  1800.                             if(i & 1)
  1801.                             {
  1802.                                 for(j = 0 ; j < NewWidth ; j++)
  1803.                                 {
  1804.                                     if((Value = (LONG)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 200) > 255)
  1805.                                         Value = 255;
  1806.                                     else
  1807.                                     {
  1808.                                         if(Value < 0)
  1809.                                             Value = 0;
  1810.                                     }
  1811.  
  1812.                                     if(TempLine[j] = (Value < 128))
  1813.                                     {
  1814.                                         if(Value)
  1815.                                         {
  1816.                                             ThisError[j + 2]    += 32 * Value;
  1817.  
  1818.                                             NextError[j - 3]    += 12 * Value;
  1819.                                             NextError[j - 1]    += 26 * Value;
  1820.                                             NextError[j + 1]    += 30 * Value;
  1821.                                             NextError[j + 3]    += 16 * Value;
  1822.  
  1823.                                             TempError[j - 2]    += 12 * Value;
  1824.                                             TempError[j    ]    += 26 * Value;
  1825.                                             TempError[j + 2]    += 12 * Value;
  1826.  
  1827.                                             LastError[j - 3]    +=  5 * Value;
  1828.                                             LastError[j - 1]    += 12 * Value;
  1829.                                             LastError[j + 1]    += 12 * Value;
  1830.                                             LastError[j + 3]    +=  5 * Value;
  1831.                                         }
  1832.                                     }
  1833.                                     else
  1834.                                     {
  1835.                                         if(Value = Value - 255)
  1836.                                         {
  1837.                                             ThisError[j + 2]    += 32 * Value;
  1838.  
  1839.                                             NextError[j - 3]    += 12 * Value;
  1840.                                             NextError[j - 1]    += 26 * Value;
  1841.                                             NextError[j + 1]    += 30 * Value;
  1842.                                             NextError[j + 3]    += 16 * Value;
  1843.  
  1844.                                             TempError[j - 2]    += 12 * Value;
  1845.                                             TempError[j    ]    += 26 * Value;
  1846.                                             TempError[j + 2]    += 12 * Value;
  1847.  
  1848.                                             LastError[j - 3]    +=  5 * Value;
  1849.                                             LastError[j - 1]    += 12 * Value;
  1850.                                             LastError[j + 1]    += 12 * Value;
  1851.                                             LastError[j + 3]    +=  5 * Value;
  1852.                                         }
  1853.                                     }
  1854.                                 }
  1855.  
  1856.                                 {
  1857.                                     register LONG *Swap;
  1858.  
  1859.                                     Swap        = ThisError;
  1860.                                     ThisError    = NextError;
  1861.                                     NextError    = TempError;
  1862.                                     TempError    = LastError;
  1863.                                     LastError    = Swap;
  1864.  
  1865.                                     memset(Swap,0,sizeof(LONG) * NewWidth);
  1866.                                 }
  1867.                             }
  1868.                             else
  1869.                             {
  1870.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  1871.                                 {
  1872.                                     if((Value = (LONG)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 200) > 255)
  1873.                                         Value = 255;
  1874.                                     else
  1875.                                     {
  1876.                                         if(Value < 0)
  1877.                                             Value = 0;
  1878.                                     }
  1879.  
  1880.                                     if(TempLine[j] = (Value < 128))
  1881.                                     {
  1882.                                         if(Value)
  1883.                                         {
  1884.                                             ThisError[j - 2]    += 32 * Value;
  1885.  
  1886.                                             NextError[j + 3]    += 12 * Value;
  1887.                                             NextError[j + 1]    += 26 * Value;
  1888.                                             NextError[j - 1]    += 30 * Value;
  1889.                                             NextError[j - 3]    += 16 * Value;
  1890.  
  1891.                                             TempError[j + 2]    += 12 * Value;
  1892.                                             TempError[j    ]    += 26 * Value;
  1893.                                             TempError[j - 2]    += 12 * Value;
  1894.  
  1895.                                             LastError[j + 3]    +=  5 * Value;
  1896.                                             LastError[j + 1]    += 12 * Value;
  1897.                                             LastError[j - 1]    += 12 * Value;
  1898.                                             LastError[j - 3]    +=  5 * Value;
  1899.                                         }
  1900.                                     }
  1901.                                     else
  1902.                                     {
  1903.                                         if(Value = Value - 255)
  1904.                                         {
  1905.                                             ThisError[j - 2]    += 32 * Value;
  1906.  
  1907.                                             NextError[j + 3]    += 12 * Value;
  1908.                                             NextError[j + 1]    += 26 * Value;
  1909.                                             NextError[j - 1]    += 30 * Value;
  1910.                                             NextError[j - 3]    += 16 * Value;
  1911.  
  1912.                                             TempError[j + 2]    += 12 * Value;
  1913.                                             TempError[j    ]    += 26 * Value;
  1914.                                             TempError[j - 2]    += 12 * Value;
  1915.  
  1916.                                             LastError[j + 3]    +=  5 * Value;
  1917.                                             LastError[j + 1]    += 12 * Value;
  1918.                                             LastError[j - 1]    += 12 * Value;
  1919.                                             LastError[j - 3]    +=  5 * Value;
  1920.                                         }
  1921.                                     }
  1922.                                 }
  1923.  
  1924.                                 {
  1925.                                     register LONG *Swap;
  1926.  
  1927.                                     Swap        = ThisError;
  1928.                                     ThisError    = NextError;
  1929.                                     NextError    = TempError;
  1930.                                     TempError    = LastError;
  1931.                                     LastError    = Swap;
  1932.  
  1933.                                     memset(Swap,0,sizeof(LONG) * NewWidth);
  1934.                                 }
  1935.                             }
  1936.  
  1937.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  1938.  
  1939.                             ShowProgress(i);
  1940.                         }
  1941.                     }
  1942.  
  1943.                     DeleteTempRPort(TempRPort);
  1944.                 }
  1945.                 else
  1946.                 {
  1947.                     DeleteBitMap(BitMap);
  1948.  
  1949.                     BitMap = NULL;
  1950.  
  1951.                     Error = ERR_NO_MEM;
  1952.                 }
  1953.             }
  1954.             else
  1955.                 Error = ERR_NO_MEM;
  1956.  
  1957.             DeleteTempLine(TempLine);
  1958.         }
  1959.         else
  1960.             Error = ERR_NO_MEM;
  1961.  
  1962.         FreeVecPooled(Data);
  1963.     }
  1964.     else
  1965.         Error = ERR_NO_MEM;
  1966.  
  1967.     *BitMapPtr = BitMap;
  1968.  
  1969.     return(Error);
  1970. }
  1971.  
  1972. LONG __regargs
  1973. DitherImage_Stucki(struct BitMap **BitMapPtr,struct GreyImage *Image,LONG NewWidth,LONG NewHeight)
  1974. {
  1975.     struct BitMap    *BitMap    = NULL;
  1976.     LONG         Error    = 0;
  1977.     APTR         Data;
  1978.  
  1979.     if(Data = AllocVecPooled(3 * (NewWidth + 4) * sizeof(WORD),MEMF_ANY | MEMF_CLEAR))
  1980.     {
  1981.         UBYTE *TempLine;
  1982.  
  1983.         if(TempLine = CreateTempLine(NewWidth,1))
  1984.         {
  1985.             if(BitMap = CreateBitMap(NewWidth,NewHeight,1,BMF_CLEAR,NULL))
  1986.             {
  1987.                 struct RastPort __aligned DummyRPort,*TempRPort;
  1988.  
  1989.                 InitRastPort(&DummyRPort);
  1990.  
  1991.                 DummyRPort . BitMap = BitMap;
  1992.  
  1993.                 if(TempRPort = CreateTempRPort(&DummyRPort))
  1994.                 {
  1995.                     LONG     i,j;
  1996.                     UBYTE    *Line;
  1997.  
  1998.                     WORD    *ThisError,
  1999.                         *NextError,
  2000.                         *LastError,
  2001.                          Value;
  2002.  
  2003.                     ThisError = Data;
  2004.                     NextError = ThisError + NewWidth + 4;
  2005.                     LastError = NextError + NewWidth + 4;
  2006.  
  2007.                     ThisError += 2;
  2008.                     NextError += 2;
  2009.                     LastError += 2;
  2010.  
  2011.                     if(NewHeight == Image -> Height)
  2012.                     {
  2013.                         for(i = 0 ; i < NewHeight ; i++)
  2014.                         {
  2015.                             Line = Image -> Lines[i];
  2016.  
  2017.                             if(i & 1)
  2018.                             {
  2019.                                 for(j = 0 ; j < NewWidth ; j++)
  2020.                                 {
  2021.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 42) > 255)
  2022.                                         Value = 255;
  2023.                                     else
  2024.                                     {
  2025.                                         if(Value < 0)
  2026.                                             Value = 0;
  2027.                                     }
  2028.  
  2029.                                     if(TempLine[j] = (Value < 128))
  2030.                                     {
  2031.                                         if(Value)
  2032.                                         {
  2033.                                             LastError[j + 2]     = Value;
  2034.                                             LastError[j - 2]    += Value;Value += Value;
  2035.                                             LastError[j + 1]    += Value;
  2036.                                             LastError[j - 1]    += Value;
  2037.                                             NextError[j + 2]    += Value;
  2038.                                             NextError[j - 2]    += Value;Value += Value;
  2039.                                             NextError[j + 1]    += Value;
  2040.                                             NextError[j - 1]    += Value;
  2041.                                             LastError[j]        += Value;
  2042.                                             ThisError[j + 2]    += Value;Value += Value;
  2043.                                             NextError[j]        += Value;
  2044.                                             ThisError[j + 1]    += Value;
  2045.                                         }
  2046.                                     }
  2047.                                     else
  2048.                                     {
  2049.                                         if(Value = Value - 255)
  2050.                                         {
  2051.                                             LastError[j + 2]     = Value;
  2052.                                             LastError[j - 2]    += Value;Value += Value;
  2053.                                             LastError[j + 1]    += Value;
  2054.                                             LastError[j - 1]    += Value;
  2055.                                             NextError[j + 2]    += Value;
  2056.                                             NextError[j - 2]    += Value;Value += Value;
  2057.                                             NextError[j + 1]    += Value;
  2058.                                             NextError[j - 1]    += Value;
  2059.                                             LastError[j]        += Value;
  2060.                                             ThisError[j + 2]    += Value;Value += Value;
  2061.                                             NextError[j]        += Value;
  2062.                                             ThisError[j + 1]    += Value;
  2063.                                         }
  2064.                                     }
  2065.                                 }
  2066.  
  2067.                                 {
  2068.                                     register WORD *Swap;
  2069.  
  2070.                                     Swap        = ThisError;
  2071.                                     ThisError    = NextError;
  2072.                                     NextError    = LastError;
  2073.                                     LastError    = Swap;
  2074.  
  2075.                                     Swap[NewWidth - 1] = 0;
  2076.                                     Swap[NewWidth - 2] = 0;
  2077.  
  2078.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  2079.                                 }
  2080.                             }
  2081.                             else
  2082.                             {
  2083.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  2084.                                 {
  2085.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 42) > 255)
  2086.                                         Value = 255;
  2087.                                     else
  2088.                                     {
  2089.                                         if(Value < 0)
  2090.                                             Value = 0;
  2091.                                     }
  2092.  
  2093.                                     if(TempLine[j] = (Value < 128))
  2094.                                     {
  2095.                                         if(Value)
  2096.                                         {
  2097.                                             LastError[j - 2]     = Value;
  2098.                                             LastError[j + 2]    += Value;Value += Value;
  2099.                                             LastError[j - 1]    += Value;
  2100.                                             LastError[j + 1]    += Value;
  2101.                                             NextError[j - 2]    += Value;
  2102.                                             NextError[j + 2]    += Value;Value += Value;
  2103.                                             NextError[j - 1]    += Value;
  2104.                                             NextError[j + 1]    += Value;
  2105.                                             LastError[j]        += Value;
  2106.                                             ThisError[j - 2]    += Value;Value += Value;
  2107.                                             NextError[j]        += Value;
  2108.                                             ThisError[j - 1]    += Value;
  2109.                                         }
  2110.                                     }
  2111.                                     else
  2112.                                     {
  2113.                                         if(Value = Value - 255)
  2114.                                         {
  2115.                                             LastError[j - 2]     = Value;
  2116.                                             LastError[j + 2]    += Value;Value += Value;
  2117.                                             LastError[j - 1]    += Value;
  2118.                                             LastError[j + 1]    += Value;
  2119.                                             NextError[j - 2]    += Value;
  2120.                                             NextError[j + 2]    += Value;Value += Value;
  2121.                                             NextError[j - 1]    += Value;
  2122.                                             NextError[j + 1]    += Value;
  2123.                                             LastError[j]        += Value;
  2124.                                             ThisError[j - 2]    += Value;Value += Value;
  2125.                                             NextError[j]        += Value;
  2126.                                             ThisError[j - 1]    += Value;
  2127.                                         }
  2128.                                     }
  2129.                                 }
  2130.  
  2131.                                 {
  2132.                                     register WORD *Swap;
  2133.  
  2134.                                     Swap        = ThisError;
  2135.                                     ThisError    = NextError;
  2136.                                     NextError    = LastError;
  2137.                                     LastError    = Swap;
  2138.  
  2139.                                     Swap[0] = 0;
  2140.                                     Swap[1] = 0;
  2141.  
  2142.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  2143.                                 }
  2144.                             }
  2145.  
  2146.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  2147.  
  2148.                             ShowProgress(i);
  2149.                         }
  2150.                     }
  2151.                     else
  2152.                     {
  2153.                         for(i = 0 ; i < NewHeight ; i++)
  2154.                         {
  2155.                             Line = (UBYTE *)Image -> Lines[(i * Image -> Height) / NewHeight];
  2156.  
  2157.                             if(i & 1)
  2158.                             {
  2159.                                 for(j = 0 ; j < NewWidth ; j++)
  2160.                                 {
  2161.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 42) > 255)
  2162.                                         Value = 255;
  2163.                                     else
  2164.                                     {
  2165.                                         if(Value < 0)
  2166.                                             Value = 0;
  2167.                                     }
  2168.  
  2169.                                     if(TempLine[j] = (Value < 128))
  2170.                                     {
  2171.                                         if(Value)
  2172.                                         {
  2173.                                             LastError[j + 2]     = Value;
  2174.                                             LastError[j - 2]    += Value;Value += Value;
  2175.                                             LastError[j + 1]    += Value;
  2176.                                             LastError[j - 1]    += Value;
  2177.                                             NextError[j + 2]    += Value;
  2178.                                             NextError[j - 2]    += Value;Value += Value;
  2179.                                             NextError[j + 1]    += Value;
  2180.                                             NextError[j - 1]    += Value;
  2181.                                             LastError[j]        += Value;
  2182.                                             ThisError[j + 2]    += Value;Value += Value;
  2183.                                             NextError[j]        += Value;
  2184.                                             ThisError[j + 1]    += Value;
  2185.                                         }
  2186.                                     }
  2187.                                     else
  2188.                                     {
  2189.                                         if(Value = Value - 255)
  2190.                                         {
  2191.                                             LastError[j + 2]     = Value;
  2192.                                             LastError[j - 2]    += Value;Value += Value;
  2193.                                             LastError[j + 1]    += Value;
  2194.                                             LastError[j - 1]    += Value;
  2195.                                             NextError[j + 2]    += Value;
  2196.                                             NextError[j - 2]    += Value;Value += Value;
  2197.                                             NextError[j + 1]    += Value;
  2198.                                             NextError[j - 1]    += Value;
  2199.                                             LastError[j]        += Value;
  2200.                                             ThisError[j + 2]    += Value;Value += Value;
  2201.                                             NextError[j]        += Value;
  2202.                                             ThisError[j + 1]    += Value;
  2203.                                         }
  2204.                                     }
  2205.                                 }
  2206.  
  2207.                                 {
  2208.                                     register WORD *Swap;
  2209.  
  2210.                                     Swap        = ThisError;
  2211.                                     ThisError    = NextError;
  2212.                                     NextError    = LastError;
  2213.                                     LastError    = Swap;
  2214.  
  2215.                                     Swap[NewWidth - 1] = 0;
  2216.                                     Swap[NewWidth - 2] = 0;
  2217.  
  2218.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  2219.                                 }
  2220.                             }
  2221.                             else
  2222.                             {
  2223.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  2224.                                 {
  2225.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 42) > 255)
  2226.                                         Value = 255;
  2227.                                     else
  2228.                                     {
  2229.                                         if(Value < 0)
  2230.                                             Value = 0;
  2231.                                     }
  2232.  
  2233.                                     if(TempLine[j] = (Value < 128))
  2234.                                     {
  2235.                                         if(Value)
  2236.                                         {
  2237.                                             LastError[j - 2]     = Value;
  2238.                                             LastError[j + 2]    += Value;Value += Value;
  2239.                                             LastError[j - 1]    += Value;
  2240.                                             LastError[j + 1]    += Value;
  2241.                                             NextError[j - 2]    += Value;
  2242.                                             NextError[j + 2]    += Value;Value += Value;
  2243.                                             NextError[j - 1]    += Value;
  2244.                                             NextError[j + 1]    += Value;
  2245.                                             LastError[j]        += Value;
  2246.                                             ThisError[j - 2]    += Value;Value += Value;
  2247.                                             NextError[j]        += Value;
  2248.                                             ThisError[j - 1]    += Value;
  2249.                                         }
  2250.                                     }
  2251.                                     else
  2252.                                     {
  2253.                                         if(Value = Value - 255)
  2254.                                         {
  2255.                                             LastError[j - 2]     = Value;
  2256.                                             LastError[j + 2]    += Value;Value += Value;
  2257.                                             LastError[j - 1]    += Value;
  2258.                                             LastError[j + 1]    += Value;
  2259.                                             NextError[j - 2]    += Value;
  2260.                                             NextError[j + 2]    += Value;Value += Value;
  2261.                                             NextError[j - 1]    += Value;
  2262.                                             NextError[j + 1]    += Value;
  2263.                                             LastError[j]        += Value;
  2264.                                             ThisError[j - 2]    += Value;Value += Value;
  2265.                                             NextError[j]        += Value;
  2266.                                             ThisError[j - 1]    += Value;
  2267.                                         }
  2268.                                     }
  2269.                                 }
  2270.  
  2271.                                 {
  2272.                                     register WORD *Swap;
  2273.  
  2274.                                     Swap        = ThisError;
  2275.                                     ThisError    = NextError;
  2276.                                     NextError    = LastError;
  2277.                                     LastError    = Swap;
  2278.  
  2279.                                     Swap[0] = 0;
  2280.                                     Swap[1] = 0;
  2281.  
  2282.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  2283.                                 }
  2284.                             }
  2285.  
  2286.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  2287.  
  2288.                             ShowProgress(i);
  2289.                         }
  2290.                     }
  2291.  
  2292.                     DeleteTempRPort(TempRPort);
  2293.                 }
  2294.                 else
  2295.                 {
  2296.                     DeleteBitMap(BitMap);
  2297.  
  2298.                     BitMap = NULL;
  2299.  
  2300.                     Error = ERR_NO_MEM;
  2301.                 }
  2302.             }
  2303.             else
  2304.                 Error = ERR_NO_MEM;
  2305.  
  2306.             DeleteTempLine(TempLine);
  2307.         }
  2308.         else
  2309.             Error = ERR_NO_MEM;
  2310.  
  2311.         FreeVecPooled(Data);
  2312.     }
  2313.     else
  2314.         Error = ERR_NO_MEM;
  2315.  
  2316.     *BitMapPtr = BitMap;
  2317.  
  2318.     return(Error);
  2319. }
  2320.  
  2321. LONG __regargs
  2322. DitherImage_BlueNoise(struct BitMap **BitMapPtr,struct GreyImage *Image,LONG NewWidth,LONG NewHeight,WORD NoiseLevel)
  2323. {
  2324.     struct BitMap    *BitMap    = NULL;
  2325.     LONG         Error    = 0;
  2326.     APTR         Data;
  2327.  
  2328.     if(Data = AllocVecPooled(2 * (NewWidth + 2) * sizeof(WORD),MEMF_ANY | MEMF_CLEAR))
  2329.     {
  2330.         UBYTE *TempLine;
  2331.  
  2332.         if(TempLine = CreateTempLine(NewWidth,1))
  2333.         {
  2334.             if(BitMap = CreateBitMap(NewWidth,NewHeight,1,BMF_CLEAR,NULL))
  2335.             {
  2336.                 struct RastPort __aligned DummyRPort,*TempRPort;
  2337.  
  2338.                 InitRastPort(&DummyRPort);
  2339.  
  2340.                 DummyRPort . BitMap = BitMap;
  2341.  
  2342.                 if(TempRPort = CreateTempRPort(&DummyRPort))
  2343.                 {
  2344.                     LONG     i,j;
  2345.                     UBYTE    *Line;
  2346.  
  2347.                     WORD    *ThisError,
  2348.                         *NextError,
  2349.                          Value,
  2350.                          Valu2,
  2351.                          SmallRange,
  2352.                          LargeRange;
  2353.  
  2354.                     SmallRange    = (10 * NoiseLevel) / 100;
  2355.                     LargeRange    = (50 * NoiseLevel) / 100;
  2356.  
  2357.                     if(!SmallRange)
  2358.                         SmallRange = 1;
  2359.  
  2360.                     if(!LargeRange)
  2361.                         LargeRange = 1;
  2362.  
  2363.                     ThisError    = Data;
  2364.                     NextError    = ThisError + NewWidth + 2;
  2365.  
  2366.                     ThisError++;
  2367.                     NextError++;
  2368.  
  2369.                     j = Seed + custom . vhposr + 16411;
  2370.  
  2371.                     for(i = 0 ; i < NewWidth ; i++)
  2372.                     {
  2373.                         ThisError[i] = ((j & 1023) - 512) / 4;
  2374.  
  2375.                         j += custom . vhposr + 16411;
  2376.                     }
  2377.  
  2378.                     Seed = j;
  2379.  
  2380.                     if(NewHeight == Image -> Height)
  2381.                     {
  2382.                         for(i = 0 ; i < NewHeight ; i++)
  2383.                         {
  2384.                             Line = Image -> Lines[i];
  2385.  
  2386.                             if(i & 1)
  2387.                             {
  2388.                                 for(j = 0 ; j < NewWidth ; j++)
  2389.                                 {
  2390.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 16) > 255)
  2391.                                         Value = 255;
  2392.                                     else
  2393.                                     {
  2394.                                         if(Value < 0)
  2395.                                             Value = 0;
  2396.                                     }
  2397.  
  2398.                                     if(TempLine[j] = (Value < 128))
  2399.                                     {
  2400.                                         Value *= 10;
  2401.  
  2402.                                         if(Valu2 = Value + Value)
  2403.                                         {
  2404.                                             NextError[j + 1]     = (Value + (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2405.                                             NextError[j - 1]    += (Value - (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2406.                                             NextError[j]        += (Value + (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2407.                                             ThisError[j + 1]    += (Value - (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;
  2408.                                         }
  2409.                                     }
  2410.                                     else
  2411.                                     {
  2412.                                         if(Value = Value - 255)
  2413.                                         {
  2414.                                             Value *= 10;
  2415.                                             Valu2 = Value + Value;
  2416.  
  2417.                                             NextError[j + 1]     = (Value + (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2418.                                             NextError[j - 1]    += (Value - (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2419.                                             NextError[j]        += (Value + (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2420.                                             ThisError[j + 1]    += (Value - (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;
  2421.                                         }
  2422.                                     }
  2423.                                 }
  2424.  
  2425.                                 {
  2426.                                     register WORD *Swap;
  2427.  
  2428.                                     Swap        = ThisError;
  2429.                                     ThisError    = NextError;
  2430.                                     NextError    = Swap;
  2431.  
  2432.                                     Swap[NewWidth - 1] = 0;
  2433.  
  2434.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  2435.                                 }
  2436.                             }
  2437.                             else
  2438.                             {
  2439.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  2440.                                 {
  2441.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 16) > 255)
  2442.                                         Value = 255;
  2443.                                     else
  2444.                                     {
  2445.                                         if(Value < 0)
  2446.                                             Value = 0;
  2447.                                     }
  2448.  
  2449.                                     if(TempLine[j] = (Value < 128))
  2450.                                     {
  2451.                                         Value *= 10;
  2452.  
  2453.                                         if(Valu2 = Value + Value)
  2454.                                         {
  2455.                                             NextError[j - 1]     = (Value + (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2456.                                             NextError[j + 1]    += (Value - (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2457.                                             NextError[j]        += (Value + (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2458.                                             ThisError[j - 1]    += (Value - (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;
  2459.                                         }
  2460.                                     }
  2461.                                     else
  2462.                                     {
  2463.                                         if(Value = Value - 255)
  2464.                                         {
  2465.                                             Value *= 10;
  2466.  
  2467.                                             NextError[j - 1]     = (Value + (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2468.                                             NextError[j + 1]    += (Value - (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2469.                                             NextError[j]        += (Value + (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2470.                                             ThisError[j - 1]    += (Value - (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;
  2471.                                         }
  2472.                                     }
  2473.                                 }
  2474.  
  2475.                                 {
  2476.                                     register WORD *Swap;
  2477.  
  2478.                                     Swap        = ThisError;
  2479.                                     ThisError    = NextError;
  2480.                                     NextError    = Swap;
  2481.  
  2482.                                     *Swap = 0;
  2483.  
  2484.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  2485.                                 }
  2486.                             }
  2487.  
  2488.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  2489.  
  2490.                             ShowProgress(i);
  2491.                         }
  2492.                     }
  2493.                     else
  2494.                     {
  2495.                         for(i = 0 ; i < NewHeight ; i++)
  2496.                         {
  2497.                             Line = (UBYTE *)Image -> Lines[(i * Image -> Height) / NewHeight];
  2498.  
  2499.                             if(i & 1)
  2500.                             {
  2501.                                 for(j = 0 ; j < NewWidth ; j++)
  2502.                                 {
  2503.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 16) > 255)
  2504.                                         Value = 255;
  2505.                                     else
  2506.                                     {
  2507.                                         if(Value < 0)
  2508.                                             Value = 0;
  2509.                                     }
  2510.  
  2511.                                     if(TempLine[j] = (Value < 128))
  2512.                                     {
  2513.                                         Value *= 10;
  2514.  
  2515.                                         if(Valu2 = Value + Value)
  2516.                                         {
  2517.                                             NextError[j + 1]     = (Value + (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2518.                                             NextError[j - 1]    += (Value - (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2519.                                             NextError[j]        += (Value + (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2520.                                             ThisError[j + 1]    += (Value - (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;
  2521.                                         }
  2522.                                     }
  2523.                                     else
  2524.                                     {
  2525.                                         if(Value = Value - 255)
  2526.                                         {
  2527.                                             Value *= 10;
  2528.                                             Valu2 = Value + Value;
  2529.  
  2530.                                             NextError[j + 1]     = (Value + (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2531.                                             NextError[j - 1]    += (Value - (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2532.                                             NextError[j]        += (Value + (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2533.                                             ThisError[j + 1]    += (Value - (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;
  2534.                                         }
  2535.                                     }
  2536.                                 }
  2537.  
  2538.                                 {
  2539.                                     register WORD *Swap;
  2540.  
  2541.                                     Swap        = ThisError;
  2542.                                     ThisError    = NextError;
  2543.                                     NextError    = Swap;
  2544.  
  2545.                                     Swap[NewWidth - 1] = 0;
  2546.  
  2547.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  2548.                                 }
  2549.                             }
  2550.                             else
  2551.                             {
  2552.                                 for(j = NewWidth - 1 ; j >= 0 ; j--)
  2553.                                 {
  2554.                                     if((Value = (WORD)Filter[Line[(j * Image -> Width) / NewWidth]] + ThisError[j] / 16) > 255)
  2555.                                         Value = 255;
  2556.                                     else
  2557.                                     {
  2558.                                         if(Value < 0)
  2559.                                             Value = 0;
  2560.                                     }
  2561.  
  2562.                                     if(TempLine[j] = (Value < 128))
  2563.                                     {
  2564.                                         Value *= 10;
  2565.  
  2566.                                         if(Valu2 = Value + Value)
  2567.                                         {
  2568.                                             NextError[j - 1]     = (Value + (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2569.                                             NextError[j + 1]    += (Value - (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2570.                                             NextError[j]        += (Value + (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2571.                                             ThisError[j - 1]    += (Value - (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;
  2572.                                         }
  2573.                                     }
  2574.                                     else
  2575.                                     {
  2576.                                         if(Value = Value - 255)
  2577.                                         {
  2578.                                             Value *= 10;
  2579.                                             Valu2 = Value + Value;
  2580.  
  2581.                                             NextError[j - 1]     = (Value + (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2582.                                             NextError[j + 1]    += (Value - (Seed % SmallRange) -  5) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2583.                                             NextError[j]        += (Value + (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;Value += Valu2;
  2584.                                             ThisError[j - 1]    += (Value - (Seed % LargeRange) - 25) / 10;Seed += custom . vhposr + 16411;
  2585.                                         }
  2586.                                     }
  2587.                                 }
  2588.  
  2589.                                 {
  2590.                                     register WORD *Swap;
  2591.  
  2592.                                     Swap        = ThisError;
  2593.                                     ThisError    = NextError;
  2594.                                     NextError    = Swap;
  2595.  
  2596.                                     *Swap = 0;
  2597.  
  2598.                                     memset(Swap,0,sizeof(WORD) * NewWidth);
  2599.                                 }
  2600.                             }
  2601.  
  2602.                             (* WriteLine)(&DummyRPort,i,NewWidth,TempLine,TempRPort);
  2603.  
  2604.                             ShowProgress(i);
  2605.                         }
  2606.                     }
  2607.  
  2608.                     DeleteTempRPort(TempRPort);
  2609.                 }
  2610.                 else
  2611.                 {
  2612.                     DeleteBitMap(BitMap);
  2613.  
  2614.                     BitMap = NULL;
  2615.  
  2616.                     Error = ERR_NO_MEM;
  2617.                 }
  2618.             }
  2619.             else
  2620.                 Error = ERR_NO_MEM;
  2621.  
  2622.             DeleteTempLine(TempLine);
  2623.         }
  2624.         else
  2625.             Error = ERR_NO_MEM;
  2626.  
  2627.         FreeVecPooled(Data);
  2628.     }
  2629.     else
  2630.         Error = ERR_NO_MEM;
  2631.  
  2632.     *BitMapPtr = BitMap;
  2633.  
  2634.     return(Error);
  2635. }
  2636.